package com.hspedu.furns.web;

import com.google.gson.Gson;
import com.hspedu.furns.entity.Cart;
import com.hspedu.furns.entity.CartItem;
import com.hspedu.furns.entity.Furn;
import com.hspedu.furns.service.FurnService;
import com.hspedu.furns.service.impl.FurnServiceImpl;
import com.hspedu.furns.utils.DataUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;

/**
 * @author 徐
 * @version 1.0
 */
public class CartServlet extends BasicServlet {

    private FurnService furnService = new FurnServiceImpl();
    /**
     * 添加家居数据到购物车的方法
     * @param request
     * @param response
     */
    public void addItem(HttpServletRequest request,HttpServletResponse response) throws IOException {
        //得到要添加的家居id
        int id = DataUtils.parseInt(request.getParameter("id"), 0);
        //根据id获取到对应的Furn对象
        Furn furn = furnService.queryFurnById(id);
        //判断id是否为null,先处理正常逻辑
        //todo

        //添加功能:如果家居库存为0，则不能添加到购物车
        if (furn.getStock() == 0){
            //重定向到首页
            response.sendRedirect(request.getContextPath()+"/index.jsp");
            return;
        }

        //如果furn不为空，根据furn 构建 CartItem
        //1 和 总价 是因为一次就添加一个商品，可以根据逻辑修改
        CartItem item = new CartItem(furn.getId(), furn.getName(), furn.getPrice(), 1, furn.getPrice());

        //从session中获取Cart对象，用于向 购物车 添加 购物项
        Cart cart = (Cart)request.getSession().getAttribute("cart");

        //判断seeion中是否有购物车对象，即是否第一次添加
        if (cart == null){
            cart = new Cart();//因为cart为null
            request.getSession().setAttribute("cart",cart);
        }
        //含有购物车对象
        cart.addItem(item);
        System.out.println(cart);

        //商品添加完购物车后，返回首页并且，购物车图标数字 变化
        //重定向到index.jsp
        response.sendRedirect(request.getHeader("Referer"));

    }

    /**
     * 从购物车中删除家居一条数据，即CartItem
     * @param request
     * @param response
     * @throws IOException
     */
    public void deleteItem(HttpServletRequest request,HttpServletResponse response) throws IOException {
        //获取要删除家居信息的id
        int id = DataUtils.parseInt(request.getParameter("id"), 0);
        //将 HashMap 中key为 id 的删除
        Cart cart = (Cart)request.getSession().getAttribute("cart");
        //如果购物车不为空
        if (cart != null){
            cart.delItem(id);
        }
        //删除之后重新回到购物车页面
        response.sendRedirect(request.getContextPath() + "/views/cart/cart.jsp");
    }

    /**
     * 清空购物车的信息
     * @param request
     * @param response
     * @throws IOException
     */
    public void clearItem(HttpServletRequest request,HttpServletResponse response) throws IOException {
        //从购物车中删除所有项
        Cart cart = (Cart)request.getSession().getAttribute("cart");
        if (cart != null){
            cart.clearItem();
        }
        //删除之后重新回到购物车页面
        response.sendRedirect(request.getContextPath() + "/views/cart/cart.jsp");
    }

    /**
     * 对购物车中的家具信息 ->数量和总价进行修改
     * @param request
     * @param response
     */
    public void updateItem(HttpServletRequest request,HttpServletResponse response) throws IOException {
        //获取要修改的家居id,数量
        int id = DataUtils.parseInt(request.getParameter("id"), 0);
        int count = DataUtils.parseInt(request.getParameter("count"), 1);
        //获取session中的cart对象
        Cart cart = (Cart)request.getSession().getAttribute("cart");
        if (cart != null){
            //调用方法
            cart.updateCount(id,count);
        }
        //修改之后重新回到请求更新购物车的页面
        //response.sendRedirect(request.getContextPath() + "/views/cart/cart.jsp");
        response.sendRedirect(request.getHeader("Referer"));

    }

    /**
     * 以ajax的方式添加到购物车
     * 即添加购物车，不需要整个页面刷新，只需要刷新数量即可
     * @param request
     * @param response
     */
    public void addItemByAjax(HttpServletRequest request,HttpServletResponse response) throws IOException {
        //得到要添加的家居id
        int id = DataUtils.parseInt(request.getParameter("id"), 0);
        //根据id获取到对应的Furn对象
        Furn furn = furnService.queryFurnById(id);

        //添加功能:如果家居库存为0，则不能添加到购物车
        if (furn.getStock() == 0){
            //重定向到首页
            response.sendRedirect(request.getContextPath()+"/index.jsp");
            return;
        }

        //如果furn不为空，根据furn 构建 CartItem
        //1 和 总价 是因为一次就添加一个商品，可以根据逻辑修改
        CartItem item = new CartItem(furn.getId(), furn.getName(), furn.getPrice(), 1, furn.getPrice());

        //从session中获取Cart对象，用于向 购物车 添加 购物项
        Cart cart = (Cart)request.getSession().getAttribute("cart");

        //判断seeion中是否有购物车对象，即是否第一次添加
        if (cart == null){
            cart = new Cart();//因为cart为null
            request.getSession().setAttribute("cart",cart);
        }
        //含有购物车对象
        cart.addItem(item);

        //商品添加完购物车后，返回首页并且，购物车图标数字 变化
        //使用ajax返回购物车数量
        //5.使用集合，创建json
        HashMap<String, Integer> resultMap = new HashMap<>();
        //获取到购物车的商品数量
        Integer totalCount = cart.getTotalCount();
        //6.将信息放入集合
        resultMap.put("totalCount",totalCount);
        //7.将集合转成json格式
        String resultJson = new Gson().toJson(resultMap);
        //返回json
        response.getWriter().write(resultJson);
    }


}
